package property

import (
	"encoding/json"
	"strconv"

	// "time"
	// "github.com/dgrijalva/jwt-go"
	"github.com/labstack/echo"
	"gopkg.in/mgo.v2/bson"

	// "github.com/jinzhu/gorm"

	"oxy_server/model"
	"oxy_server/module/log"
	"oxy_server/until"
)

type (
	PropertyNew struct {
		ID        bson.ObjectId `json:"_id" bson:"_id"`
		Name      string        `json:"name" bson:"name"`           // 物料描述
		Id        string        `json:"id" bson:"id"`               // 公司编号
		Code      string        `json:"code" bson:"code"`           // 工厂编号
		Color     string        `json:"color" bson:"color"`         // 颜色
		Colorcode string        `json:"colorcode" bson:"colorcode"` // 工厂色号
		Material  string        `json:"material" bson:"material"`   // 材质
		Compose   string        `json:"compose" bson:"compose"`     // 工厂成分
		Menfu     string        `json:"menfu" bson:"menfu"`         //门幅
		Size      string        `json:"size" bson:"size"`           // 规格
		Weight    string        `json:"weight" bson:"weight"`       // 克重
		Shazhi    string        `json:"shazhi" bson:"shazhi"`       // 纱之
		Cost      string        `json:"cost" bson:"cost"`           //单价
		Provider  string        `json:"provider" bson:"provider"`   //供应商
		Type      string        `json:"type" bson:"type"`           //大类
		Smalltype string        `json:"smalltype" bson:"smalltype"` //类目
		Note      string        `json:"note" bson:"note"`           // 备注
		Number    int           `json:"number" bson:"number"`       // 序号
	}
	InsertPropertyNew struct {
		Name      string `json:"name" bson:"name"`           // 物料描述
		Id        string `json:"id" bson:"id"`               // 公司编号
		Code      string `json:"code" bson:"code"`           // 工厂编号
		Color     string `json:"color" bson:"color"`         // 颜色
		Colorcode string `json:"colorcode" bson:"colorcode"` // 工厂色号
		Material  string `json:"material" bson:"material"`   // 材质
		Compose   string `json:"compose" bson:"compose"`     // 工厂成分
		Menfu     string `json:"menfu" bson:"menfu"`         //门幅
		Size      string `json:"size" bson:"size"`           // 规格
		Weight    string `json:"weight" bson:"weight"`       // 克重
		Shazhi    string `json:"shazhi" bson:"shazhi"`       // 纱之
		Cost      string `json:"cost" bson:"cost"`           //单价
		Provider  string `json:"provider" bson:"provider"`   //供应商
		Type      string `json:"type" bson:"type"`           //大类
		Smalltype string `json:"smalltype" bson:"smalltype"` //类目
		Note      string `json:"note" bson:"note"`           // 备注
		Number    int    `json:"number" bson:"number"`       // 序号

	}
)
type OXYPropertyV3 struct{}

func NewOXYPropertyV3() *OXYPropertyV3 {
	Data := &OXYPropertyV3{}
	return Data
}

func (ro *OXYPropertyV3) GetPropertyListHandler(c echo.Context) error {
	currentpage, err := strconv.Atoi(c.QueryParam("currentpage"))
	perpage, err := strconv.Atoi(c.QueryParam("perpage"))
	jsonquery := c.QueryParam("like")
	if err != nil {
		log.Error("解析参数错误", err)
		c.JSON(403, map[string]interface{}{
			"msg": "error",
		})
		return err
	}
	model.DB().Dbname = "OxyDic"
	model.DB().Document = "property_v3"
	M, err := until.JsonToBson(jsonquery)
	if err != nil {
		log.Error("json-> bson 失败", err)
		c.JSON(403, map[string]interface{}{
			"msg": "error",
		})
		return err
	}
	query, count, err := model.DB().QuerySort(M, currentpage, perpage, "_id")
	if err != nil {
		log.Error("查询出错", err)
		c.JSON(404, map[string]interface{}{
			"msg": "error",
		})
		return err
	}
	ps := []PropertyNew{}
	query.All(&ps)

	str, err := json.Marshal(ps)
	if err != nil {
		log.Error("解析参数错误", err)
		c.JSON(403, map[string]interface{}{
			"msg": "error",
		})
		return err
	}
	c.JSON(200, map[string]interface{}{
		"msg":   "success",
		"data":  string(str),
		"count": count,
	})

	return nil

}

func (ro *OXYPropertyV3) GetPropertyInfoHandler(c echo.Context) error {
	log.Info("GetRoleInfoHandler")
	id := c.QueryParam("id")
	model.DB().Dbname = "OxyDic"
	model.DB().Document = "property_v3"
	query, err := model.DB().QueryOne(bson.M{"_id": bson.ObjectIdHex(id)})
	if err != nil {
		c.JSON(403, map[string]interface{}{
			"msg": "error",
		})
		return nil
	}
	p := PropertyNew{}
	query.One(&p)
	str, err := json.Marshal(p)
	if err != nil {
		c.JSON(403, map[string]interface{}{
			"msg": "error",
		})
		return nil
	}
	c.JSON(200, map[string]interface{}{
		"msg":  "success",
		"data": string(str),
	})

	return nil
}

func (ro *OXYPropertyV3) AddPropertyHandler(c echo.Context) error {
	s := &InsertPropertyNew{}
	if err := c.Bind(s); err != nil {
		log.Error("解析参数错误", err)
		c.JSON(403, map[string]interface{}{
			"msg": "error",
		})
		return err
	}

	model.DB().Dbname = "OxyDic"
	model.DB().Document = "property_v3"
	query, count, _ := model.DB().QuerySort(nil, 1, 1, "-number")
	p := []InsertPropertyNew{}
	query.All(&p)
	if len(p) > 0 {
		if p[0].Number > count {
			s.Number = p[0].Number + 1
		} else {
			s.Number = count + 1
		}
	} else {
		s.Number = count + 1
	}
	num := strconv.Itoa(s.Number)
	if len(num) < 4 {
		length := 4 - len(num)
		for i := 0; i < length; i++ {
			num = "0" + num
		}
	}
	s.Id = s.Material + s.Smalltype + num
	err := model.DB().Insert(s)
	if err != nil {
		log.Error("插入出错", err)
		c.JSON(404, map[string]interface{}{
			"msg": "error",
		})
		return err
	}
	c.JSON(200, map[string]interface{}{
		"msg": "success",
	})

	return nil
}

func (ro *OXYPropertyV3) AddPropertysHandler(c echo.Context) error {
	s := []InsertPropertyNew{}
	if err := c.Bind(&s); err != nil {
		log.Error("AddPropertysHandler 解析参数错误", err)
		c.JSON(403, map[string]interface{}{
			"msg": "error",
		})
		return err
	}

	model.DB().Dbname = "OxyDic"
	for _, item := range s {
		model.DB().Document = "property_v3"
		err := model.DB().Insert(item)
		if err != nil {
			log.Error("插入出错 AddPropertysHandler", err)
		}
	}
	c.JSON(200, map[string]interface{}{
		"msg": "success",
	})

	return nil
}

func (ro *OXYPropertyV3) UpdatePropertyHandler(c echo.Context) error {
	id := c.QueryParam("id")
	log.Info("UpdateSupplierTableHandler", id)

	s := &InsertPropertyNew{}
	if err := c.Bind(s); err != nil {
		log.Error("解析参数错误", err)
		c.JSON(404, map[string]interface{}{
			"msg": "error",
		})
		return err
	}

	model.DB().Dbname = "OxyDic"
	model.DB().Document = "property_v3"
	num := strconv.Itoa(s.Number)
	if len(num) < 4 {
		length := 4 - len(num)
		for i := 0; i < length; i++ {
			num = "0" + num
		}
	}
	s.Id = s.Material + s.Smalltype + num

	err := model.DB().Update(bson.M{"_id": bson.ObjectIdHex(id)}, s)
	if err != nil {
		log.Error("插入出错", err)
		c.JSON(404, map[string]interface{}{
			"msg": "error",
		})
		return err
	}

	c.JSON(200, map[string]interface{}{
		"msg": "success",
	})

	return nil
}
func (ro *OXYPropertyV3) DelPropertyHandler(c echo.Context) error {
	id := c.QueryParam("id")
	log.Info("DelSupplierTableHandler", id)
	model.DB().Dbname = "OxyDic"
	model.DB().Document = "property_v3"
	err := model.DB().Remove(bson.M{"_id": bson.ObjectIdHex(id)})
	if err != nil {
		log.Error("删除出错", err)
		c.JSON(404, map[string]interface{}{
			"msg": "error",
		})
		return err
	}
	c.JSON(200, map[string]interface{}{
		"msg": "success",
	})

	return nil
}
